package com.cskaoyan.javase.oop2._1extends._4hierarchy;

/**
 * 思考:
 *      Java中的一个类，能不能使用extends关键字同时继承多个类呢?
 *
 * 在Java中,一个类是无法直接使用extends关键字,继承多个类的
 * 这种只能有一个直接父类的设计,称之为单继承,单重继承
 * 与之相对,就还有多继承,多重继承,典型的就是C++
 *
 * Java中的一个类,只能有一个直接父类.
 *
 * 思考:
 *      Java中的一个类,就只能有一个父类吗?
 *      不是,因为父类可能还有父类,所以子类可以有很多间接父类
 *      但是在Java中,是存在一个顶层父类的,是Object类
 *      在Java中Every class has {@code Object} as a superclass.
 *      Java中的类要么是Object类的直接子类(一个类如果没有写extends直接继承,那么它就继承Object),要么是间接子类
 *
 *      虽然直接父类只有一个，但Java中一个类仍然可以有很多个"间接父类"，因为父类可能还有父类。比如A继承B，B又继承了C，那么A的直接父类就是B，间接父类是C。于是就形成了下面几个概念：
 *
 * 祖先类：处在继承顶层的类。
 * 继承层次（hierarchy）：由某个祖先类派生出来的所有类的集合叫做继承层次。
 * 继承链：从某一个子类开始，到其祖先类的路径。
 *
 * 继承层次中需要注意的地方：
 * 在一条继承链中，总称呼下游类是上游类的子类，不管隔了几层。没有孙子类或者重孙类这种概念。
 * 在一条继承链中的，下游的类总是继承上游类的所有成员，不管隔了几层。
 * 在一条继承链中，下游类总可以看成一个上游类，存在"is-a"关系。
 * 不在同一条继承链中的类，没有任何关系。虽然看起来像"兄弟姐妹"类，但是Java是不讲究血统的。
 *
 * 因为一方面，子类可以自由扩展功能；另一方面，继承来的东西也是可以修改的。
 * 所以"兄弟姐妹"可能完全和"我"不同，没有任何关系。
 * 不能循环定义继承。比如A继承B，B继承C，再让C来继承A，这是不行的。
 *
 * @since 10:55
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        /*
            思考:创建Grandson类对象,有几种方式?
            4种 + 1种(Object)
         */
        Grandson gs = new Grandson();
        System.out.println(gs.gVar);

        Grandfather gf = new Grandson();
        Father f = new Grandson();
        Son s = new Grandson();

        Object o = new Grandson();

        // 不在一个继承链中的两个类没有任何关系
        // Father2 f2 = new Grandson();
    }
}

// Cyclic inheritance involving 'com.cskaoyan.javase.oop2._1extends._4hierarchy.Grandfather'
class Grandfather {
    int gVar;
}

class Father extends Grandfather {
    int fVar;
}

class Father2 extends Grandfather {
}

// Class cannot extend multiple classes
// class Son extends Father, Father2 {
// }
class Son extends Father {
    int sVar;
}

class Grandson extends Son {
    int gsVar;
}